分享主軸
JSON Web Token 的縮寫,是一種基於 RFC 7519 的開放標準,以 JSON 物件的形式安全傳遞,這些物件可以被驗證和信任,因為它經過數位簽屬
可以使用 HMAC 或使用 RSA 或 ECDSA 等演算法進行簽名
可以看成三個部分,以 . 區分,如下範例
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
{
  "alg": "HS256",
  "typ": "JWT"
}
Registered Claims : 標準聲明,可以放,不強制
iss(Issuer):發行者,JWT 的發行者
sub(Subject):用戶的唯一標識,通常是所面向的用戶(為了哪個用戶而簽發的)
aud(Audience):接收者,JWT 的接收者
exp(Expiration Time):過期時間,JWT 的過期時間
nbf(Not Before):生效時間,JWT 在此時間之前無效
iat(Issued At):簽發時間,JWT 的簽發時間
jti(JWT ID):JWT ID,JWT 的唯一ID,用於防止惡意使用者一直使用
Public Claims : 允許自訂義聲明,但避免名稱衝突 (不與 IANA JSON Web Token Registry 內的名稱有衝突 ),可向官方申請自定義的聲明
Private Claims : 允許自訂義聲明,不受標準限制 ( 不需要在 IANA JSON Web Token Registry 中註冊 )
小差異
{
  "sub": "1234567890",
  "name": "Mars",
  "admin": true
}
解釋 Signature 生成步驟
使用 Base64Url 編碼將 Header 和 Payload 轉換為字符串
base64UrlEncode(header) + "." + base64UrlEncode(payload)
將編碼後的 Header 和 Payload 用點(.)連接起來
base64UrlEncode(header) + "." + base64UrlEncode(payload)
使用指定的演算法(例如 HMAC SHA256)和密鑰串聯後,進行簽名
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
將簽名結果進行 Base64Url 編碼,得到最終的 Signature
base64UrlEncode(HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret))
安裝套件
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
設定檔內
  "JWT": {
    "Key": "YourSecretKeyHereWithAtLeast32Characters",
    "Issuer": "YourIssuer",
    "Audience": "YourAudience"
  }
Program.cs
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = true,
        ValidIssuer = builder.Configuration["JWT:Issuer"],
        ValidAudience = builder.Configuration["JWT:Audience"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:Key"]!))
    };
});
呼叫的地方
             var claims = new[]
            {
            new Claim(JwtRegisteredClaimNames.Sub, login.Username),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:Key"]!));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var token = new JwtSecurityToken(
                issuer: _configuration["JWT:Issuer"],
                audience: _configuration["JWT:Audience"],
                claims: claims,
                expires: DateTime.Now.AddMinutes(30),
                signingCredentials: creds);
            return new JwtSecurityTokenHandler().WriteToken(token);
結果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJNYXJzIiwianRpIjoiYTVkMjVjMjctMmY1OS00OWMwLWJkNTQtZjMxMDQ3MjMxZDExIiwiZXhwIjoxNzI3NzcxODAwLCJpc3MiOiJZb3VySXNzdWVyIiwiYXVkIjoiWW91ckF1ZGllbmNlIn0.beBeDsY4yCULA3tSXPEEduDKTDkHOiIKZrO1ejzAiVA
產出的 JWT 結構
圖中可以看到上面介紹的三大部分結構,就是 JWT 的組成
今日結語
了解如何應用在 ASP .NET Core 內實作 JWT Token,這種方式很常見,比如登入等等,也更了解 JWT 到底是什麼
一步一腳印,慢慢累積程式知識,加油 ~
明天繼續努力!
提供官方網址
https://jwt.io/